package it.traveldream.utility;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import it.traveldream.EJB.UtenteEJBImpl;
import it.traveldream.EJB.DTO.*;
import it.traveldream.EJB.entities.*;

public class Entities2DTO {

	public static AcquistoDTO convertAcquisti(Acquisti shopping, AcquistiPK primaryk, List<User> listaU){

		AcquistoDTO result = new AcquistoDTO();

		Iterator<User> iter = listaU.iterator();
		User right_one = new User();


		while (iter.hasNext()){

			right_one = iter.next();
			if(right_one.getIdUtente() == primaryk.getIdUtente()) break;

		}

		result.setPacchetto(Entities2DTO.convertPacchetti(shopping.getPacchetti(),listaU));
		result.setUtente(Entities2DTO.convertUser(right_one));
		result.setNumeroAcquisti(shopping.getNumeroAcquisti());

		return result;

	}

	public static AlloggioDTO convertAlloggi(Alloggi zimmer){

		AlloggioDTO result = new AlloggioDTO();

		result.setCitta(Entities2DTO.convertCitta(zimmer.getCitta()));
		result.setDeleted(zimmer.getDeleted());
		result.setDescrizione(zimmer.getDescrizione());
		result.setIdAlloggio(zimmer.getIdAlloggio());






		return result;

	}

	public static StatoDTO convertStati (Stati state){

		StatoDTO result = new StatoDTO();

		result.setCode(state.getCode());
		result.setContinent(state.getContinent());
		result.setName(state.getName());
		result.setRegion(state.getRegion());

		return result;


	}

	public static CittaDTO convertCitta(Citta city){

		CittaDTO result = new CittaDTO();

		result.setDistrict(city.getDistrict());
		result.setStati(Entities2DTO.convertStati(city.getStati()));
		result.setId(city.getId());
		result.setName(city.getName());
		result.setPopulation(city.getPopulation());
		return result;


	}

	public static UtenteDTO convertUser(User user){

		UtenteDTO result = new UtenteDTO();

		result.setCognome(user.getCognome());
		result.setDataFromDate(user.getDataNascita());
		result.setEmail(user.getEmail());
		result.setNome(user.getNome());
		result.setPassword(user.getPassword());
		result.setUsername(user.getUserid());
		result.setIduser(user.getIdUtente());

		return result;

	}


	public static TrasportoSingoloDTO convertTrasportiSingoli(TrasportiSingoli trasp){


		TrasportoSingoloDTO result = new TrasportoSingoloDTO();

		result.setCittaArrivo(Entities2DTO.convertCitta(trasp.getCitta2()));
		result.setCittaPartenza(Entities2DTO.convertCitta(trasp.getCitta1()));
		result.setData(trasp.getData());
		result.setDeleted(trasp.getDeleted());
		result.setDisponibilita(trasp.getDisponibilita());
		result.setIdTrasporto(trasp.getIdTrasporto());
		result.setPrezzo(trasp.getPrezzo());


		return result;


	}



	public static EscursioneDTO convertEscursioni(Escursioni esc){


		EscursioneDTO result = new EscursioneDTO();

		result.setCitta(Entities2DTO.convertCitta(esc.getCitta()));
		result.setDeleted(esc.getDeleted());
		result.setDescrizione(esc.getDescrizione());
		result.setIdEscursione(esc.getIdEscursione());
		result.setPrezzo(esc.getPrezzo());

		return result;





	}



	public static PacchettoDTO  convertPacchetti(Pacchetti pkg, List<User> listaU){

		PacchettoDTO result = new PacchettoDTO();
		User pkg_usr = new User();
		List<Escursioni> list_entity = pkg.getEscursionis();
		ArrayList<EscursioneDTO> listConverted = new ArrayList<EscursioneDTO>();

		Iterator<Escursioni> listToConvert = list_entity.iterator();
		Iterator<User> iter = listaU.iterator();


		while(listToConvert.hasNext()){
			listConverted.add(Entities2DTO.convertEscursioni(listToConvert.next()));
		}


		while (iter.hasNext()){
			pkg_usr = iter.next();
			if (pkg.getCreatoDa() == pkg_usr.getIdUtente()){
				break;
			}

		}

		switch(pkg.getTipocamera()){
		case 1: result.setTipocamera("Singola");
		break;
		case 2: result.setTipocamera("Doppia");
		break;
		case 3: result.setTipocamera("Tripla");
		break;
		case 4: result.setTipocamera("Quadrupla");
		break;
		default: break;
		}


		result.setAlloggi(Entities2DTO.convertAlloggi(pkg.getAlloggi()));
		result.setCategorie(Entities2DTO.convertCategorie(pkg.getCategorie()));
		result.setCitta(Entities2DTO.convertCitta(pkg.getAlloggi().getCitta()));
		result.setCreato_da(Entities2DTO.convertUser(pkg_usr));
		result.setCustom(pkg.getCustom());
		result.setDeleted(pkg.getDeleted());
		result.setDescrizione_categoria(pkg.getCategorie().getDescrizione());
		result.setEscursionis(listConverted);
		result.setIdPacchetto(pkg.getIdPacchetto());
		result.setPartenza(pkg.getTrasportiSingoli1().getData());
		result.setPrezzo(Entities2DTO.Prezzo_pacchetto(pkg.getTrasportiSingoli1(), pkg.getTrasportiSingoli2(), pkg.getEscursionis(), pkg.getAlloggi(),pkg.getTipocamera()));
		result.setRitorno(pkg.getTrasportiSingoli2().getData());
		result.setSconto(pkg.getSconto());
		result.setTrasportAndata(Entities2DTO.convertTrasportiSingoli(pkg.getTrasportiSingoli1()));
		result.setTrasportRitorno(Entities2DTO.convertTrasportiSingoli(pkg.getTrasportiSingoli2()));
		result.setDisponibilita(pkg.getDisponibilita());




		return result;



	}


	public static CategoriaDTO convertCategorie (Categorie cat){

		CategoriaDTO result = new CategoriaDTO();

		result.setDescrizione(cat.getDescrizione());
		result.setIdCategoria(cat.getIdCategoria());

		return result;



	}


	public static DisponibilitaDTO convertDisponibilita(Disponibilita disp){

		DisponibilitaDTO result = new DisponibilitaDTO();

		result.setAlloggio(Entities2DTO.convertAlloggi(disp.getAlloggi()));
		result.setData(disp.getData());
		result.setIdDisponibilita(disp.getIdDisponibilita());
		result.setNumerocamere(disp.getNumerocamere());
		result.setPrezzo(disp.getPrezzo());
		result.setTipoCamera(disp.getTipoCamera());


		return result;

	}

	public static GiftListDTO convertGiftList (GiftList gift, List<User> listaU, EntityManager em){

		UtenteEJBImpl help = new UtenteEJBImpl(em);
		GiftListDTO result = new GiftListDTO();

		result.setAcquistato(gift.getAcquistato());
		result.setAcquistatoDa(gift.getAcquistatoDa());
		result.setIdElemento(gift.getIdElemento());
		result.setIdServizioBase(gift.getIdServizioBase());
		result.setUsernameUtente(help.getUsernameFromId(gift.getIdUtente()));
		result.setPacchetto(Entities2DTO.convertPacchetti(gift.getPacchetti(),listaU));
		result.setTipo_servizio_base(gift.getTipo_servizioBase());;
		return result;

	}

	public static ModificaDTO convertModifiche (Modifiche mod,List<User> listaU){

		ModificaDTO result = new ModificaDTO();

		result.setDataModifica(mod.getDataModifica());
		result.setIdModifica(mod.getIdModifica());
		result.setIdUtente(mod.getIdUtente());
		result.setPacchetto(Entities2DTO.convertPacchetti(mod.getPacchetti(),listaU));

		return result;

	}

	public static double Prezzo_pacchetto (TrasportiSingoli andata,TrasportiSingoli ritorno, List<Escursioni> list_esc, Alloggi sweet_home, int tipocamera ){

		double sum_esc = 0;
		double sum_al=0;
		double sum_trasp=0;

		Iterator<Disponibilita> free = sweet_home.getDisponibilitas().iterator();
		Iterator<Escursioni> iter_esc = list_esc.iterator();
		Disponibilita help = new Disponibilita();
		int tipoCam = 0;
		
		while (free.hasNext()){
			help = free.next();
			if ((help.getData().after(andata.getData()) && help.getData().before(ritorno.getData()))||help.getData().equals(andata.getData())||help.getData().equals(ritorno.getData())){
				
				//casto il tipo camera a int
				if (help.getTipoCamera().equals("Quadrupla")) tipoCam = 4;
				if (help.getTipoCamera().equals("Tripla")) tipoCam = 3;
				if (help.getTipoCamera().equals("Doppia")) tipoCam = 2;
				if (help.getTipoCamera().equals("Singola")) tipoCam = 1;
				
				//sommo il prezzo della camera giusta
				if (tipoCam == tipocamera)
					sum_al += help.getPrezzo();
					
				
			}
		}

		while(iter_esc.hasNext()){
			sum_esc += (iter_esc.next().getPrezzo())*tipocamera;
		}

		sum_trasp=(andata.getPrezzo()+ritorno.getPrezzo())*tipocamera;

		return sum_trasp+sum_esc+sum_al;

	}

}
